# -*- coding: utf-8 -*-
# Gestión de la configuración de la aplicación.

## vipera, un diseñador de aplicaciones para Python
##     Copyright (C) 2011 Ángel Luis García García
##
##    This program is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import wx

import os
import sys

from configuracion_vista import panel_conf_vipera
from persistencia import wrapper_objeto
from i18n_vipera import t

# VERSION.
VERSION = '1.0.0'

# NOMBRE DE APLICACIÓN
NOMBRE_APLIC = 'vipera'

# FECHA CREACIÓN.
FECHA_CREACION = 'Diciembre 2011'

# Valores constantes.
enter = '\n'

# Separador de ruta.
def separador_ruta():
   if os.name == 'posix': sep = '/'
   if os.name == 'nt': sep = '\\'
   return sep

proy_por_defecto = {'VERSION' : VERSION, 
                    'NOMBRE_APLIC' : NOMBRE_APLIC,
                    'FECHA_CREACION' : FECHA_CREACION,
                    'carpeta_proyecto' : 'proyectos',
                    'carpeta_temporal' : 'temporal',
                    'carpeta_recursos' : 'recursos',
                    'carpeta_codigo' : 'scripts',
                    'indentacion' : 4,
                    'codificacion' : 'utf-8',
                    'script_eje_unix' : '#! /usr/bin/env python',
                    'sep' : separador_ruta(),
                    'fich_license' : 'LICENSE.TXT', 
                    'fich_readme' : 'README.TXT',
                    'fich_history' : 'HISTORY.TXT',
                    'ext_proy' : 'vipera_project',
                    'nfich_conf': 'recursos' + separador_ruta() + 'config' + separador_ruta() + 'config.vipera_conf',
                    'fich_tips' : 'recursos' + separador_ruta() + 'templates' + separador_ruta() + 'tips.txt',
                    'tutorial_html' : 'recursos' + separador_ruta() + 'templates' + separador_ruta() + 'tutorial_vipera.html',
                    'icon_aplic' : 'recursos' + separador_ruta() + 'images' + separador_ruta() + "logo_3.ico",
                    'fich_licencias' : 'recursos' + separador_ruta() + 'templates',
                    'f_cod' : 'temporal' + separador_ruta() + 'codigo_vipera.py',
                    'f_sal' : 'temporal' + separador_ruta() + 'salida.vipera',
                    'f_err' : 'temporal' + separador_ruta() + 'errores.vipera', 
                    'interprete' : 'python',
                    'lanzadera' : 'scripts' + separador_ruta() + 'lanzadera.py',
                    'fich_imp' : 'temporal' + separador_ruta() + 'imp_file.vipera',
                    'fich_html' : 'temporal' + separador_ruta() + 'imp_file.html',
                    'rss' : 'http://www.python.org/channews.rdf',
                    'f_tmp_html' : 'temporal' + separador_ruta() + 'temp_file.html',
                    'fichero_log' : 'recursos' + separador_ruta() + 'log' + separador_ruta() + 'log_vipera',
                    'nfilas' : 50,
                    'ogl_ancho_maximo' : 2000,
                    'ogl_alto_maximo' : 2000,
                    'ogl_tope_horizontal' : 1500.0,
                    'file_restart_app' : 'temporal' + separador_ruta() + 'restart_app.vipera',
                    'tipo_dato_python' : [ u"-", u"int",u"long",u"float", u"list", u"tuple", 
                                           u"str", u"unicode", u"dict", u"set", u"frozenset", u"boolean" ],
                    'cadena_web' : 'http://docs.python.org/search.html?q=%s&check_keywords=yes&area=default'}

por_defecto = {'titulo_aplic' : u'vipera: Un diseñador de aplicaciones para Python',
               'color_back' : (255, 255, 255, 255),
               'activar_tips' : True,
               'idioma' : u'Español',
               'alto_ogl' : proy_por_defecto['ogl_alto_maximo'],
               'ancho_ogl' : proy_por_defecto['ogl_ancho_maximo'],
               'tope_hor_ogl' : proy_por_defecto['ogl_tope_horizontal'],
               'color_back_ogl' : (255, 255, 255, 255)}

class conf_vipera(object):
   '''Configuración de la aplicación'''
   def __init__(self):
      '''Constructor de clase'''
      self.__f = wrapper_objeto()
      self.__ruta = os.path.realpath(proy_por_defecto['nfich_conf'])
      self.__clase_objeto = None
   
   def crear_fich_por_defecto(self):
      '''Creación de fichero de configuración'''
      open(self.__ruta,'w').close()
      self.guardar_fichero(por_defecto)
   
   def abrir_fichero(self):
      '''Abrir fichero de configuración'''
      # Método para abrir fichero de configuración.
      if not os.path.exists(self.__ruta):
         self.crear_fich_por_defecto()
      self.__clase_objeto = self.__f.cargar_objeto(self.__ruta)

   def recuperar_datos(self):    
      '''Obtener datos de configuración'''
      # Recuperamos datos.
      objeto = self.__clase_objeto.datos
      return objeto
   
   def guardar_fichero(self, objeto):
      '''Guardar configuración en fichero'''
      # Serializamos objeto.
      self.__f.datos = objeto
      self.__f.guardar_objeto(self.__ruta)

class panel_conf_vipera_p(panel_conf_vipera):
   '''Panel de configuración de la aplicación'''
   def __init__(self, parent, frame_principal = None, idioma = None):
      '''Constructor de clase'''      
      # Llamamos al padre.
      panel_conf_vipera.__init__(self, parent)
      # Idioma.
      self.l = idioma
      # Cambiamos idioma de los widgets de wxFB.
      self.m_staticText_idioma.SetLabel(t(u'Idioma', self.l))
      # self.m_staticText_titulo.SetLabel(t(u'Título de la aplicación', self.l))
      self.m_staticText__bg_aplic.SetLabel(t(u'Color background de la aplicación', self.l))
      self.m_checkBox_tips.SetLabel(t(u'Activar "Consejos del día" al iniciar la aplicación', self.l))
      self.m_staticText_alto_ogl.SetLabel(t(u'Altura', self.l))
      self.m_staticText_ancho_ogl.SetLabel(t(u'Anchura', self.l))
      self.m_staticText_tope_hor.SetLabel(t(u'Tope horizontal', self.l))
      self.m_staticText_bg_ogl.SetLabel(t(u'Color background del diseñador de clases', self.l))
      self.m_button_aplicar_cambios.SetLabel(t(u'Aplicar cambios', self.l))
      # Referencias al panel principal y al de ingeniería inversa.
      # self.__panel_prin = panel_principal
      # self.__panel_ing_inv = panel_ing_inv
      self.frame_principal = frame_principal
      
      # Cargamos fichero.
      f = conf_vipera()
      f.abrir_fichero()
      datos = f.recuperar_datos()
      
      # Incluimos datos en el panel de configuración.
      self.m_colourPicker_back.SetColour(datos['color_back'])
      # self.m_textCtrl_titulo.SetValue(t(datos['titulo_aplic'], self.l))
      self.m_checkBox_tips.Set3StateValue(datos['activar_tips'])
      self.m_choice_idioma.SetStringSelection(datos['idioma'])
      self.m_spinCtrl_alto_ogl.SetValue(datos['alto_ogl'])
      self.m_spinCtrl_ancho_ogl.SetValue(datos['ancho_ogl'])
      self.m_spinCtrl_tope_hor_ogl.SetValue(datos['tope_hor_ogl'])
      self.m_colourPicker_back_ogl.SetColour(datos['color_back_ogl'])

   def OnAplicarCambios(self, event):
      '''Aplicar cambios después de configuración de la aplicación'''
      i = wx.MessageBox(t(u'Se necesita reiniciar la aplicación. Se perderán datos no salvados. ¿Continuar?', self.l),
                        t(u'Atención', self.l), wx.YES_NO)
      if i != wx.YES: return
      # Creamos fichero para reinicio.
      try:
         open(proy_por_defecto['file_restart_app'], 'w').close()
         # Salimos de la ejecución gráfica de la aplicación.
         self.frame_principal.salida_aplicacion(False) 
      except:
         wx.MessageBox(t(u'No se ha podido iniciar mecanismo de reinicio de la aplicación', self.l), t(u'Atención', self.l))
      